package controller;

import entity.User;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

/**
 * Author:shixiaojun@itany.com
 * Date:2022/7/28 13:33
 * Version:1.0-SNAPSHOT
 * Description:
 */
// 当前类被@RestController进行标注
// 表示当前类中的所有方法均不再返回视图
// 而是直接返回数据模型
// 相当于为当前类中的所有方法自动加了@ResponseBody注解
//@Controller
@RestController
@RequestMapping("/login")
public class LoginController {

    @RequestMapping("/f1")
    public String f1(ModelMap modelMap){
        modelMap.addAttribute("msg","Hello SpringMVC");
        return "login";
    }

    @RequestMapping("/f2")
    public ModelAndView f2(){
        ModelAndView mav = new ModelAndView();
        mav.setViewName("redirect:/showLogin");
        return mav;
    }

    @RequestMapping("/f3")
    public String f3(){
        // 直接返回字符串
        // 此时的字符串将作为视图名返回
        // 该视图名需要经过viewResolver处理
        return "login";
    }

    @RequestMapping("/f4")
    public String f4(){
        // 转发到指定的url地址
        return "forward:/showLogin";
    }

    @RequestMapping("/f5")
    public String f5(){
        // 重定向到指定的url地址
        return "redirect:/showLogin";
    }

    @RequestMapping("/f6")
    public void f6(){
        System.out.println("LoginController.f6");
        // login/f6
        // 当方法的参数中没有响应对象的时候
        // 将当前的请求名作为视图名返回
    }

    @RequestMapping("/f7")
    public void f7(HttpServletRequest request){
        System.out.println("LoginController.f7");
    }

    @RequestMapping("/f8")
    public void f8(HttpServletResponse response) throws IOException {
        System.out.println("LoginController.f8");
        PrintWriter out = response.getWriter();
        out.print("<h1>Hello World</h1>");
        // 当方法的参数包含响应对象时
        // 会将当前Handler的响应交给该参数处理
    }

    @RequestMapping("/f9")
    public void f9(PrintWriter out){
        out.print("<h1>Hello World</h1>");
    }


    // 当方法或者方法的返回值类型被@ResponseBody注解所标注时
    // 表示当前方法不再返回视图
    // 而是直接返回数据模型
    @ResponseBody
    @RequestMapping("/f10")
    public String f10(){
        return "login";
    }

    @RequestMapping("/f11")
    public @ResponseBody String f11(){
        return "login";
    }

    // 当方法的返回值是ModelAndView时
    // 会无数@ResponseBody注解
    // 仍然返回视图与模型
    @ResponseBody
    @RequestMapping("/f12")
    public ModelAndView f12(){
        ModelAndView mav = new ModelAndView();
        mav.setViewName("login");
        return mav;
    }

    @RequestMapping("/f13")
    public void f13(HttpServletRequest request) throws UnsupportedEncodingException {
        request.setCharacterEncoding("utf-8");
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        System.out.println("username:"+username+",password:"+password);
    }

    @RequestMapping("/f14")
    public void f14(String username,String password){
        System.out.println("username:"+username+",password:"+password);
    }

    // @RequestParam("key")注解用于将请求中指定的参数的值注入到当前注解所标注的方法参数上
    // 本质上即为:request.getParameter("key")
    // 当方法的参数满足以下三个条件时,自动加@RequestParam(key)注解
    // 1.当前方法的参数没有被任何注解所标注
    // 2.当前方法的参数不是一个对象
    // 3.当前请求中存在与当前方法的参数的变量名一致的key的数据
    // value属性:指定当前请求中注入数据的key
    // required属性:指定当前参数是否必须要注入值
        // 默认值为true,表示必须注入,如果请求中没有对应的数据,则报错
        // 如果值为false,表示不是必须的,当请求中存在对应数据,则注入,当请求中不存在对应数据,则不注入
    @RequestMapping("/f15")
    public ModelAndView f15(@RequestParam(value = "username",required = false) String username, @RequestParam(value = "password",required = false) String password, HttpSession session) {
        System.out.println("username:"+username+",password:"+password);
        ModelAndView mav = new ModelAndView();

        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String url = "jdbc:mysql://127.0.0.1:3306/ums?useUnicode=true&characterEncoding=utf-8";
        User user = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection(url,"root","");
            String sql = new StringBuffer()
                    .append(" select id,username,password,phone,address ")
                    .append(" from t_user ")
                    .append(" where username = ? ")
                    .append(" and password = ? ")
                    .toString();
            ps = conn.prepareStatement(sql);
            ps.setString(1,username);
            ps.setString(2,password);
            rs = ps.executeQuery();
            if(rs.next()){
                user = new User();
                user.setId(rs.getInt("id"));
                user.setUsername(rs.getString("username"));
                user.setPassword(rs.getString("password"));
                user.setPhone(rs.getString("phone"));
                user.setAddress(rs.getString("address"));
                mav.setViewName("main");
                session.setAttribute("user",user);
                return mav;
            }
            mav.addObject("loginMsg","用户名或密码错误");
        } catch (Exception e) {
            e.printStackTrace();
            mav.addObject("loginMsg","服务器内部异常");
        }
        mav.setViewName("login");
        return mav;
    }

    public void f16(){

    }
}
